import axios, { AxiosRequestConfig } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { store } from '@/store'
import router from '@/router/'

// 根据不同环境 切换不同路径
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASEURL
})

// 请求拦截器
request.interceptors.request.use(function (config: any) {
  // 统一设置用户身份 token
  const user = store.state.user
  if (user && user.token) {
    config.headers.Authorization = `Bearer ${user.token}`
  }
  return config
}, function (error) {
  return Promise.reject(error)
})

// 控制登录过期的锁
let isRefreshing = false

// 响应拦截器
request.interceptors.response.use(function (response) {
  // 统一设置接口相应错误, 比如 token 过期失效, 服务端异常
  const status = response.data.status
  if (!status || status === 200) { // 正常情况
    return response
  }
  if (status === 410000) { // 异常情况: token 过期...
    if (isRefreshing) return Promise.reject(response)
    isRefreshing = true
    // 提示是否跳转登录页
    ElMessageBox.confirm('你的登录状态已经过期, 是否前往登录页面?', '提示', {
      confirmButtonText: '确认',
      cancelButtonText: '取消'
    })
      .then(() => {
        // 清除本地过期登录状态
        store.commit('setUser', null)
        // 跳转登录页面
        router.push({
          name: 'login',
          query: {
            redirect: router.currentRoute.value.fullPath
          }
        })
        // 抛出异常
      })
      .finally(() => {
        isRefreshing = false
      })
      // 内部这个消化业务异常
    return Promise.reject(response)
  }
  // 其他情况
  ElMessage.error(response.data.msg || '请求失败, 请刷新后重试')
  // 手动返回一个 Promise 异常
  return Promise.reject(response.data)
}, function (error) {
  return Promise.reject(error)
})

// 接口返回数据处理
export default <T = any>(config: AxiosRequestConfig) => {
  return request(config).then(res => {
    return (res.data.data || res.data) as T
  })
}
